
package py.com.erpone.session.almacen.list;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import py.com.erpone.entity.almacen.Lote;
import py.com.erpone.entity.almacen.LoteDetalle;
import py.com.erpone.entity.dm.Inventario;
import py.com.erpone.entity.dm.Presentacion;
import py.com.erpone.util.LocaleSelector;

@Stateless
@LocalBean
@Named
public class LoteList {

	@PersistenceContext
	private EntityManager em;

	LocaleSelector localeSelector;

	@SuppressWarnings("unchecked")
	public List<Lote> findAll(){
		List<Lote> result=(List<Lote>)em.createNamedQuery("lote.all").getResultList();
		for (Lote lote : result) {
			if(lote !=null && !lote.getSituacion().trim().isEmpty()){
				lote.setSituacionExtenso(this.getSituacionExtenso(lote.getSituacion(), lote.getListSituacion()));
			}
		}
		return result;
	}
	
	public String getSituacionExtenso(String key, HashMap<String, String> listSituacion) {
		localeSelector = new LocaleSelector();
		String retorno = key;
		Map<String, String> map = listSituacion;
		for (Map.Entry<String, String> entry : map.entrySet()){
			if(key.equals(entry.getValue())){
				return localeSelector.getMensaje("situacion."+entry.getKey());
			}
		}		
		return retorno;
	}

	@SuppressWarnings("unchecked")
	public List<LoteDetalle> findAllDetalles(Lote lote){
		List<LoteDetalle> result=(List<LoteDetalle>)em.createNamedQuery("lote.allDetalles").setParameter("id", lote.getId()).getResultList();
		return result;
	}

	@SuppressWarnings("unchecked")
	public List<Lote> findAllReceipt(){
		List<Lote> result=(List<Lote>)em.createNamedQuery("lote.allReceipt").getResultList();
		for (Lote lote : result) {
			if(lote !=null && !lote.getSituacion().trim().isEmpty()){
				lote.setSituacionExtenso(this.getSituacionExtenso(lote.getSituacion(), lote.getListSituacion()));
			}
		}
		return result;
	}
	
	@SuppressWarnings("unchecked")
	public List<Lote> findAllVerification(){
		List<Lote> result=(List<Lote>)em.createNamedQuery("lote.allVerification").getResultList();
		for (Lote lote : result) {
			if(lote !=null && !lote.getSituacion().trim().isEmpty()){
				lote.setSituacionExtenso(this.getSituacionExtenso(lote.getSituacion(), lote.getListSituacion()));
			}
		}
		return result;
	}
	@SuppressWarnings("unchecked")
	public List<Lote> findAllLocation(){
		List<Lote> result=(List<Lote>)em.createNamedQuery("lote.allLocation").getResultList();
		for (Lote lote : result) {
			if(lote !=null && !lote.getSituacion().trim().isEmpty()){
				lote.setSituacionExtenso(this.getSituacionExtenso(lote.getSituacion(), lote.getListSituacion()));
			}
		}
		return result;
	}
	@SuppressWarnings("unchecked")
	public List<Lote> ImportarAVerificacion(){
		List<Lote> result=(List<Lote>)em.createNamedQuery("lote.importarAVerificacion").getResultList();
		for (Lote sp : result) {
			if(sp !=null && !sp.getSituacion().trim().isEmpty()){
				sp.setSituacionExtenso(this.getSituacionExtenso(sp.getSituacion(), sp.getListSituacion()));
			}
		}
		return result;
	}
	@SuppressWarnings("unchecked")
	public List<Lote> ImportarAUbicacion(){
		List<Lote> result=(List<Lote>)em.createNamedQuery("lote.importarAUbicacion").getResultList();
		for (Lote sp : result) {
			if(sp !=null && !sp.getSituacion().trim().isEmpty()){
				sp.setSituacionExtenso(this.getSituacionExtenso(sp.getSituacion(), sp.getListSituacion()));
			}
		}
		return result;
	}
	
	@SuppressWarnings("unchecked")
	public Inventario findInventario(LoteDetalle item){

		Inventario result = null;
		try {
			String sql = " select i.* " +
						 " from Inventario i " +
						 " where i.producto_id = ? " +
						 " and i.loteDetalle_id = ? " +
						 " and i.almacen_id = ? " ;

			Query query = em.createNativeQuery(sql, Inventario.class);
			query.setParameter(1, item.getProducto().getId());
			query.setParameter(2, item.getId());
			query.setParameter(3, item.getLote().getAlmacen().getId());
			
			Object o = query.getSingleResult();
			result = null; 
			if(o != null)
				result = (Inventario) o;
		} catch (NoResultException e1) {
			return null;
		}catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return result;
	}

}
